; -------------------------------------------------
;       GDTR 和 TR 相关操作
;
;       qianyi.lh  2014/11/04  14:15:54
; -------------------------------------------------

[GLOBAL gdt_flush]

gdt_flush:
        mov eax, [esp+4]  ; 参数存入 eax 寄存器
        lgdt [eax]        ; 加载到 GDTR [修改原先GRUB设置]

        mov ax, 0x10      ; 加载数据段描述符
        mov ds, ax        ; 更新所有可以更新的段寄存器
        mov es, ax
        mov fs, ax
        mov gs, ax
        mov ss, ax
        jmp 0x08:.flush   ; 远跳转，0x08是代码段描述符
                          ; 远跳目的是清空流水线并串行化处理器
.flush:
        ret

[GLOBAL tss_flush]        ; TSS 刷新
tss_flush:
        mov ax, 0x28      ; TSS 在全局描述符表里是第5个
       		          ; 故而 00101000B 即就是 0x28
        ltr ax            ; 加载到 TR 寄存器
        ret

